/**
* Created by GoLand.
* User: link1st
* Date: 2019-07-29
* Time: 14:15
 */

package task

import "time"

type TimerFunc func(interface{}) bool

/**
 * 定时调用
 * @delay 首次延时
 * @tick  间隔
 * @fun   定时执行function
 * @param fun参数
 */
func Timer(delay, tick time.Duration, fun TimerFunc, param interface{}, funcDefer TimerFunc, paramDefer interface{}) {
	go func() {
		defer func() {
			if funcDefer != nil {
				funcDefer(paramDefer)//定时退出函数执行
			}
		}()

		if fun == nil {
			return
		}

		t := time.NewTimer(delay)
		defer t.Stop()

		for {
			select {
			case <-t.C://如果时间超时
				if fun(param) == false {
					return
				}
				//1.8 如果明确time已经expired，并且t.C已经被取空，那么可以直接使用Reset；如果程序之前没有从t.C中读取过值，这时需要首先调用Stop()，如果返回true，说明timer还没有expire，
				//stop成功删除timer，可直接reset；如果返回false，说明stop前已经expire，需要显式drain channel。
				t.Reset(tick)//执行完重置定时器
			}
		}
	}()
}
